#include "GestordeRed.hpp"
GestordeRed::GestordeRed()
{
             
}

GestordeRed::GestordeRed(int cant, Listarouter list)
{
    lrouter=list;
    cantidadrouter=cant;                        
}

void GestordeRed::computarcaminos()
{
    Listarouter *temp,*temp3;
    Router *temp2;
    temp=&lrouter;
    float salida[256];
    int puertosalida[256];
    float matriz[256][256];
    for (int i=0;i<256;i++)
        puertosalida[i]=0;
    for(int j=0;j<cantidadrouter;j++)        /* Solicita el valor de relacion de ancho de banda y los paquetes para enviar por el canal */
    {                                     /*de cada uno de los puertos de salida de cada router*/  
        temp3=&lrouter;
        while(temp3)
        {
            if(temp3->getD()->ip==(j))
                temp3->getD()->daranchodesalida(&salida);
            temp3 = temp3->siguiente(); 
        }
      //  temp2=temp->getD();
      //  temp2->daranchodesalida(&salida);
         printf("\n rout= %d",j);  
        for(int f=0;f<cantidadrouter/*256*/;f++)
        {
            matriz[j][f]=salida[f]; /*con los valores dados arma una matriz*/
            printf("\n %d   %f",f,salida[f]); 
            //system("pause");
        }
        temp = temp->siguiente();
        //system("pause");
    }
  //  system("pause");
    temp=&lrouter;
    for(int j=0;j<cantidadrouter;j++)
    {
        dijstra(j,&matriz,&puertosalida,cantidadrouter);
        temp3=&lrouter;
        while(temp3)
        {
            if(temp3->getD()->ip==(j))
                temp3->getD()->devolvercamino(&puertosalida);
            temp3 = temp3->siguiente(); 
        }
        
    }
}



void GestordeRed::dijstra(int inicial, float (*matriz)[256][256], int (*puertodesalida)[256], int tamano)
{
    float distancia[256];
    int previo[256],conocido[256];//,puertodesalida[256];
    //int matriz[256][256];
    for(int i=0;i<tamano;i++)
    {
        distancia[i]=INF;       
        previo[i]=300;
        conocido[i]=false;
    }     
      
    conocido[inicial]=true;          /* marco como conocido el nodo inicial*/ 
    for(int i=0;i<tamano;i++)        /*carga todas las distancias hacia los vecinos*/
    {
        if((*matriz)[inicial][i]<INF)
        {
            previo[i]=inicial;
            distancia[i]=(*matriz)[inicial][i];
        }                  
    }
     
    float menordistancia;
    int nodomenordistancia;
    for(int i=0;i<tamano;i++)
    {       
        menordistancia=INF;
        nodomenordistancia=300;
        for(int f=0;f<tamano;f++)   /*busca en el vector de distancias la de menor valor que no sea conocido*/
        {
            if(menordistancia>distancia[f] && conocido[f]==false)
            {
                menordistancia=distancia[f];
                nodomenordistancia=f;
            }
        }
        if(nodomenordistancia!=300)    
        {
            conocido[nodomenordistancia]=true;
            for(int f=0; f<tamano; f++)
            {
                if(distancia[f]>((*matriz)[nodomenordistancia][f]+distancia[nodomenordistancia]))
                {
                    distancia[f]=(*matriz)[nodomenordistancia][f]+distancia[nodomenordistancia];
                    previo[f]=nodomenordistancia;
                }
            }
        }
    }
    int i=0;
    int f;
 /*    for(int o=0;o<5;o++)
     {
             printf("%d   previo= %d \n",o, previo[o]);
     }*/          
    while(/*previo[i]<300*/i<tamano)
    {
        f=i;
        while(previo[f]!=inicial)
        {
            f=previo[f];
        }         
        (*puertodesalida)[i]=f;  
        i++;
    }
}
